import java.util.Scanner;  // 导入输入工具类，用于读取用户输入

// 主类名必须为Main（OJ提交要求）
public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);  // 创建输入对象，用于读取数据

        int n = in.nextInt();  // 读取数组的长度n（比如输入5，就表示数组有5个元素）

        // dp数组：dp[i]表示「以第i个元素结尾的最大子数组和」
        int[] dp = new int[n + 1];  // 下标从1开始（方便处理第1个元素）

        // arr数组：存储输入的原始数组
        int[] arr = new int[n + 1];  // 同样下标从1开始，与dp对应

        // 读取数组元素：循环n次，把输入的数存到arr[1]到arr[n]中
        for (int i = 1; i <= n; i++) {
            arr[i] = in.nextInt();
        }

        // 初始化：以第1个元素结尾的最大子数组和就是它自己
        dp[1] = arr[1];
        // max用于记录全局的最大子数组和，初始值设为dp[1]（至少有一个元素）
        int max = dp[1];

        // 从第2个元素开始计算（i=2到i=n）
        for (int i = 2; i <= n; i++) {
            // 核心公式：
            // 对于第i个元素，有两种选择：
            // 1. 把它加入到「以i-1结尾的子数组」中（此时和为dp[i-1] + arr[i]）
            // 2. 不加入前面的子数组，自己单独作为一个子数组（此时和为arr[i]）
            // 取两种选择中较大的那个，作为dp[i]的值
            dp[i] = Math.max(dp[i - 1], 0) + arr[i];
            // 解释：Math.max(dp[i-1], 0)的意思是：
            // 如果前面的子数组和（dp[i-1]）是负数，不如从当前元素重新开始（加0相当于只取arr[i]）

            // 更新全局最大值：比较当前dp[i]和之前的max，取更大的那个
            max = Math.max(dp[i], max);
        }

        // 输出全局最大子数组和
        System.out.println(max);
    }
}